package com.lee.demo.ui.activity;

import android.graphics.Color;
import android.graphics.Typeface;
import android.text.Spannable;
import android.text.SpannableStringBuilder;
import android.text.Spanned;
import android.text.TextPaint;
import android.text.method.LinkMovementMethod;
import android.text.style.AbsoluteSizeSpan;
import android.text.style.BackgroundColorSpan;
import android.text.style.ClickableSpan;
import android.text.style.StyleSpan;
import android.text.style.URLSpan;
import android.view.View;
import android.widget.CheckBox;
import android.widget.CheckedTextView;
import android.widget.TextView;

import com.lee.demo.R;
import com.lee.demo.base.BaseActivity;
import com.lee.demo.base.SwipeBackActivity;

import cn.lee.cplibrary.util.ObjectUtils;
import cn.lee.cplibrary.util.ScreenUtil;
import cn.lee.cplibrary.util.SpanUtils;
import cn.lee.cplibrary.util.tv.NoUnderlineSpan;

public class TextViewActivity extends SwipeBackActivity {

    private CheckedTextView ctv1;
    private CheckBox cbProtocol;
    private TextView tvEditable, tvAutoLink, tvSpannable, tvSpanutil, tvSpanClick, tvGradient,tvSpanClick2;

    @Override
    protected BaseActivity getSelfActivity() {
        return this;
    }

    @Override
    protected int getLayoutResId() {
        return R.layout.activity_text_view;
    }

    @Override
    public String getPagerTitle() {
        return null;
    }

    @Override
    public String getPagerRight() {
        return null;
    }

    @Override
    public void initView() {
        tvGradient = (TextView) findViewById(R.id.tv_gradient);
        tvAutoLink = (TextView) findViewById(R.id.tv_autoLink_phone);
        tvEditable = (TextView) findViewById(R.id.tv_editable);
        tvSpannable = (TextView) findViewById(R.id.tv_spannable);
        tvSpanutil = (TextView) findViewById(R.id.tv_spanutil);
        tvSpanClick = (TextView) findViewById(R.id.tv_span_click);
        tvSpanClick2 = (TextView) findViewById(R.id.tv_span_click2);
        ctv1 = (CheckedTextView) findViewById(R.id.ctv);
        cbProtocol = (CheckBox) findViewById(R.id.cb_protocol);
    }


    @Override
    protected void initData() {
        testBufferType();
        removeAutoLinkUnderline(tvAutoLink);
        noteProperties();
        initCtv();
        cbProtocol.toggle();//反选
        SpanUtils.setTextGradient(tvGradient, 1, Color.parseColor("#FDF099"), Color.parseColor("#FF947B"));
    }

    /**
     * CheckedTextView
     */
    private void initCtv() {
        ctv1.setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View v) {
                ctv1.toggle();//反选
            }
        });
    }

    /**
     * 测试BufferType
     */
    private void testBufferType() {
        //测试BufferType = EDITABLE：可追加内容
        tvEditable.setText(tvEditable.getText(), TextView.BufferType.NORMAL);
        tvEditable.append(",我是java的append");//自动设置成 EDITABLE
        tvEditable.append(",测试start和end", 0, 8);

        //测试BufferType = SPANNABLE，可设置不同样式
        Spannable span = (Spannable) tvSpannable.getText();
        span.setSpan(new BackgroundColorSpan(Color.YELLOW), 12, 17, Spannable.SPAN_COMPOSING);//设置颜色
        span.setSpan(new StyleSpan(Typeface.BOLD), 17, 22, Spannable.SPAN_EXCLUSIVE_EXCLUSIVE);//设置粗细、斜体
        span.setSpan(new AbsoluteSizeSpan(22, true), 22, span.length(), Spannable.SPAN_EXCLUSIVE_EXCLUSIVE);//设置大小

        //工具类SpanUtils封装的就是SPANNABLE，使用起来更方便，功能更强大
        tvSpanutil.setText(new SpanUtils(getSelfActivity())
                .append("我是工具类SpanUtils，")
                .append("我是绿色，").setForegroundColor(Color.GREEN)
                .append("我是粗体，").setBold()
                .append("我是22sp").setFontSize(22, true)
                .create());


        //添加点击事件，添加样式
        tvSpanClick.setTextColor(Color.BLACK);
        SpannableStringBuilder ssb = new SpannableStringBuilder();
        ssb.append("测试点击事件，");
        int start = 0, end = ssb.length();
        //不同的我文字的点击事件
        ssb.setSpan(new ClickableSpan() {

            @Override
            public void onClick(View widget) {
                toast("测试点击事件");
            }

            @Override
            public void updateDrawState(TextPaint ds) {
                super.updateDrawState(ds);
                ds.setColor(Color.parseColor("#000000"));
                ds.setUnderlineText(false);// 去掉下划线
            }

        }, start, end, 0);


        //不同的我文字的点击事件
        ssb.append("我是绿色，");
        start = end;
        end = ssb.length();
        ssb.setSpan(new ClickableSpan() {

            @Override
            public void onClick(View widget) {
                toast("我是绿色");
            }

            @Override
            public void updateDrawState(TextPaint ds) {
                super.updateDrawState(ds);
                ds.setColor(Color.GREEN);
                ds.setUnderlineText(false); // 去掉下划线

            }

        }, start, end, Spannable.SPAN_EXCLUSIVE_EXCLUSIVE);

        ssb.append("我是粗体，");
        start = end;
        end = ssb.length();
        ssb.setSpan(new StyleSpan(Typeface.BOLD), start, end, Spannable.SPAN_EXCLUSIVE_EXCLUSIVE);//设置粗细、斜体
        ssb.append("我是22sp");
        start = end;
        end = ssb.length();
        ssb.setSpan(new ClickableSpan() {

            @Override
            public void onClick(View widget) {
                toast("我是22sp");
            }

            @Override
            public void updateDrawState(TextPaint ds) {
                super.updateDrawState(ds);
                ds.setColor(Color.BLACK);
                ds.setTextSize(ScreenUtil.dp2px(getSelfActivity(), 22));
                ds.setUnderlineText(false);  // 去掉下划线

            }

        }, start, end, Spannable.SPAN_EXCLUSIVE_EXCLUSIVE);
        tvSpanClick.setMovementMethod(LinkMovementMethod.getInstance());//不设置点击会失效
        tvSpanClick.setHintTextColor(getResources().getColor(android.R.color.transparent));//不设置会有背景色
        tvSpanClick.setHighlightColor(Color.TRANSPARENT);
        tvSpanClick.setText(ssb);//设置内容

        int startIndex = 0;
        SpannableStringBuilder ssb1 = new SpannableStringBuilder();
        for (int i = 0; i < 10; i++) {
            ssb1.append("#点击事件" + i+"#  ");
            int finalI = i;
            startIndex = setTxtClick(ssb1, startIndex, new OnSpanClickListener() {
                @Override
                public void click(SpannableStringBuilder ssb, int start, int end) {
                    toast(finalI + "---" + start+"----"+end);

                }
            });
        }
        tvSpanClick2.setMovementMethod(LinkMovementMethod.getInstance());//不设置点击会失效
        tvSpanClick2.setHintTextColor(getResources().getColor(android.R.color.transparent));//不设置会有背景色
        tvSpanClick2.setHighlightColor(Color.TRANSPARENT);
        tvSpanClick2.setText(ssb1);//设置内容
    }


    /**
     * 去掉AutoLink下划线
     *
     * @param tv
     */
    private void removeAutoLinkUnderline(TextView tv) {
        if (tv.getText() instanceof Spannable) {
            URLSpan[] urlSpans = (((Spannable) tv.getText()).getSpans(0, tv.getText().length() - 1, URLSpan.class));
            for (URLSpan urlSpan : urlSpans) {
                String url = urlSpan.getURL();
                int start = ((Spannable) tv.getText()).getSpanStart(urlSpan);
                int end = ((Spannable) tv.getText()).getSpanEnd(urlSpan);
                NoUnderlineSpan noUnderlineSpan = new NoUnderlineSpan(url);
                Spannable s = (Spannable) tv.getText();
                s.setSpan(noUnderlineSpan, start, end, Spanned.SPAN_POINT_MARK);
            }
        }
    }

    /**
     * 解释TextView的部分属性
     */
    private void noteProperties() {
        // android:ellipsize 设置当文字过长时,该控件该如何显示。有如下值设置：”start”—?省略号显示在开头;”end”——省略号显示在结尾;”middle”—-省略号显示在中间;”marquee” ——以跑马灯的方式显示(动画横向移动)
        // android:marqueeRepeatLimit	在ellipsize指定marquee的情况下，设置重复滚动的次数，当设置为marquee_forever时表示无限次。
        //android:imeOptions 附加功能，设置右下角IME动作与编辑框相关的动作，如actionDone右下角将显示一个“完成”，而不设置默认是一个回车符号。
//        android:ems	设置TextView的宽度为N个字符的宽度。这里测试为一个汉字字符宽度
//        android:maxEms	设置TextView的宽度为最长为N个字符的宽度。与ems同时使用时覆盖ems选项。
//        android:minEms	设置TextView的宽度为最短为N个字符的宽度。与ems同时使用时覆盖ems选项。
//        android:maxLength	限制显示的文本长度，超出部分不显示。
//      	android:lines	设置文本的行数，设置两行就显示两行，即使第二行没有数据。
//        android:maxLines	设置文本的最大显示行数，与width或者layout_width结合使用，超出部分自动换行，超出行数将不显示。
//       android:minLines	设置文本的最小行数，与lines类似。
//       android:lineSpacingExtra	设置行间距。
//        android:lineSpacingMultiplier	设置行间距的倍数。如”1.2”
//        android:scrollHorizontally	设置文本超出TextView的宽度的情况下，是否出现横拉条。
//        android:singleLine	设置单行显示。如果和layout_width一起使用，当文本不能全部显示时，后面用“…”来表示。如android:text="test_ singleLine "android:singleLine=“true” android:layout_width="20dp"将只显示“t…”。如果不设置singleLine或者设置为false，文本将自动换行
//        android:textAppearance	设置文字外观。如“?android:attr/textAppearanceLargeInverse”这里引用的是系统自带的一个外观，?表示系统是否有这种外观，否则使用默认的外观。可设置的值如下：textAppearanceButton/textAppearanceInverse/textAppearanceLarge/textAppearanceLargeInverse/textAppearanceMedium/textAppearanceMediumInverse/textAppearanceSmall/textAppearanceSmallInverse
//        android:textScaleX	设置文字之间间隔，默认为1.0f。
//        android:textStyle	设置字形[bold(粗体) 0, italic(斜体) 1, bolditalic(又粗又斜) 2] 可以设置一个或多个，用“
//        android:typeface	设置文本字体，必须是以下常量值之一：normal 0, sans 1, serif 2, monospace(等宽字体) 3]
    }


    /**
     * 设置text的点击监听、样式
     */
    private int setTxtClick(SpannableStringBuilder ssb, int startIndex, OnSpanClickListener listener) {
        if (ssb == null) {
            return startIndex + 1;
        }
        int start = startIndex, end = ssb.length();
        ssb.setSpan(new ClickableSpan() {
            //txt的点击事件
            @Override
            public void onClick(View widget) {
                if (listener != null) {
                    listener.click(ssb,start,end);
                }
            }

            @Override
            public void updateDrawState(TextPaint ds) {
                super.updateDrawState(ds);
                ds.setColor(Color.GREEN);
                ssb.setSpan(new BackgroundColorSpan(Color.YELLOW), start, end, Spanned.SPAN_EXCLUSIVE_EXCLUSIVE ) ;
//                ds.setColor(Color.parseColor("#000000"));
                ds.setUnderlineText(false);// 去掉下划线
            }

        }, start, end, 0);
        return end;
    }

    public interface OnSpanClickListener {
        void click(SpannableStringBuilder ssb, int start, int end);
    }
}
